package agh.rozproszony;

import agh.rozproszony.DBStorage.DataBaseEngine;
import agh.rozproszony.DBStorage.DatabaseUnitTestClass;
import agh.rozproszony.DBStorage.TestDataGenerator;
import agh.rozproszony.messages.MessagesRMIServer;
import agh.rozproszony.messages.MessagesServer;
import agh.rozproszony.reservations.ReservationsRMIServer;
import agh.rozproszony.reservations.ReservationsServer;
import java.rmi.Naming;

/**
 * Program glowny aplikacji serwerowej dla projektu "Rozproszony system
 * rezerwacji pomieszczen i przesylania wiadomosci"
 */
public class RozproszonyServer {

    private static boolean alreadyRunning = false;
    
    
    public static void main(String[] args) {
        System.out.println("=== Uruchamianie serwera projektu Rozproszony ===");
        
        if ( alreadyRunning ) {
            System.out.println("!!!!!!!!!!!!!!!!! wykryto wielokrotne uruchamianie serwera !!!!!!!!!!!!!!!!!!!!");
        }
        alreadyRunning = true;
       
        System.out.println("=== Odczytywanie konfiguracji ===");

        RozproszonyConfiguration config = new RozproszonyConfiguration();
        config.printConfiguration();

        System.out.println("=== Ustawianie codebase RMI ===");
       
        // Programowe ustawienie -Djava.rmi.server.codebase zamiast linii polecen
        System.setProperty("java.rmi.server.codebase", config.getRmiCodebase());

        
        System.out.println("=== Inicjalizowanie bazy danych ===");
        //DataBaseEngine databaseEngine = new DatabaseUnitTestClass();
        DataBaseEngine databaseEngine = new DatabaseUnitTestClass();

        System.out.println("=== Uzupelnianie bazy danych testowymi danymi ===");
        TestDataGenerator.prepareSampleDatabase(databaseEngine);
        
        try {
            System.out.println("=== Uruchamianie uslugi rezerwacji RMI ===");

            ReservationsServer reservationsServer = new ReservationsRMIServer(databaseEngine);
            Naming.rebind(config.getRmiReservationServiceAddress(), reservationsServer);

            System.out.println("=== Uruchamianie uslugi wiadomosci RMI ===");

            MessagesServer messagesServer = new MessagesRMIServer(databaseEngine);
            Naming.rebind(config.getRmiMessagesServiceAddress(), messagesServer);
            
            System.out.println("=== SERWER GOTOWY DO PRACY ===");
        } catch (Exception e) {
            System.out.println("Nie mozna uruchomic serwera systemu rozproszonego. Blad: " + e);
            e.printStackTrace();
            System.exit(1);
        }
    }
}
